/*
 * Créé le 18 mars 06
 */
package fr.cdesire.sudoku.applet;

import fr.cdesire.sudoku.elements.Sudoku;
import fr.cdesire.sudoku.elements.exceptions.NotSudokuSolutionException;
import fr.cdesire.sudoku.elements.exceptions.NotValidSudokuGridException;
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Calendar;
import netscape.javascript.JSObject;

/**
 * @author Cedric
 * Cette classe affiche la solution d'une grille Sudoku.
 */
public class GrilleSudoku extends Applet {

    private Sudoku sudoku;
    int[][] tab;
    long duree;
    String messageErreur;
    Number value;
    JSObject win;
    boolean emptyTab = true;

    /**
     * Initialisation de l'applet : Récupération des valeurs passées en paramètre,
     */
    @Override
    public void init() {

        tab = new int[Sudoku.NB_CASES_LIGNE_GRILLE][Sudoku.NB_CASES_LIGNE_GRILLE];

        win = JSObject.getWindow(this);

        for (int i = 0; i < Sudoku.NB_CASES_LIGNE_GRILLE; i++) {
            for (int j = 0; j < Sudoku.NB_CASES_LIGNE_GRILLE; j++) {
                String param;
                int val;
                try {
                    param = (String) win.eval("getElement(" + i + ", " + j + ")");
                    val = param.equals("") ? 0 : Integer.parseInt(param);
                } catch (NullPointerException e) {
                    val = 0;
                }
                if (emptyTab && val != 0) {
                    emptyTab = false;
                }
                tab[i][j] = val;
            }
        }
    }

    /**
     * Démarrage de l'applet : appel de la méthode statique de recherche de solution.
     */
    @Override
    public void start() {

        if (!emptyTab) {

            try {

                long deb = Calendar.getInstance().getTime().getTime();

                sudoku = new Sudoku(tab);
                sudoku.validation();
                sudoku = Sudoku.rechercheSolution(sudoku);
                tab = sudoku.getGrille();
                long fin = Calendar.getInstance().getTime().getTime();

                duree = fin - deb;

                for (int i = 0; i < Sudoku.NB_CASES_LIGNE_GRILLE; i++) {
                    for (int j = 0; j < Sudoku.NB_CASES_LIGNE_GRILLE; j++) {
                        win.call("setElement", new Object[]{i, j, tab[i][j]});
                    }
                }

            } catch (NotSudokuSolutionException e1) {
                messageErreur = e1.getMessage();
            } catch (NotValidSudokuGridException e2) {
                messageErreur = e2.getMessage();
            }
        }

        repaint();
    }

    /**
     * Affichage de la solution.
     */
    @Override
    public void paint(Graphics g) {

        if (messageErreur != null && messageErreur.length() > 0) {
            g.drawString(messageErreur, 10, 10);
        } else if (!emptyTab) {
            g.drawString("Temps : " + duree + "ms", 10, 10);
        }
    }
}
